package com.wande.dataplatform.filecollection.validation.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.wande.dataplatform.filecollection.domain.dto.ValidationError;
import com.wande.dataplatform.filecollection.validation.IValidationRule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * 格式校验规则
 * 使用正则表达式校验字段格式
 * 配置格式: {"pattern": "正则表达式", "message": "错误消息"}
 *
 * @author wande
 */
@Slf4j
@Component
public class FormatValidationRule implements IValidationRule {

    @Override
    public String getRuleType() {
        return "FORMAT";
    }

    @Override
    public ValidationError validate(String fieldName, Object value, String ruleConfig) {
        // 如果值为空，跳过校验（由非空校验处理）
        if (value == null) {
            return null;
        }

        try {
            JSONObject config = JSONUtil.parseObj(ruleConfig);
            String pattern = config.getStr("pattern");
            String message = config.getStr("message", "格式不正确");

            if (StrUtil.isBlank(pattern)) {
                log.warn("格式校验规则配置缺少pattern参数");
                return null;
            }

            String valueStr = value.toString();
            if (!Pattern.matches(pattern, valueStr)) {
                return new ValidationError(
                    fieldName,
                    getRuleType(),
                    String.format("字段 [%s] %s，当前值: %s", fieldName, message, valueStr),
                    value,
                    null
                );
            }

            return null;
        } catch (Exception e) {
            log.error("格式校验规则执行失败: {}", e.getMessage());
            return new ValidationError(
                fieldName,
                getRuleType(),
                String.format("字段 [%s] 格式校验失败: %s", fieldName, e.getMessage()),
                value,
                null
            );
        }
    }

    @Override
    public boolean isValidConfig(String ruleConfig) {
        try {
            JSONObject config = JSONUtil.parseObj(ruleConfig);
            String pattern = config.getStr("pattern");
            
            if (StrUtil.isBlank(pattern)) {
                return false;
            }

            // 验证正则表达式是否有效
            Pattern.compile(pattern);
            return true;
        } catch (Exception e) {
            log.error("格式校验规则配置无效: {}", e.getMessage());
            return false;
        }
    }
}
